package by.grsu.ri;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import by.grsu.hdm.exceptions.UnknownMediaIdException;
import by.grsu.hdm.media.Audio;
import by.grsu.hdm.media.Media;
import by.grsu.hdm.media.Video;

/**
 * Servlet implementation class MediaServlet
 */

public class MediaServlet extends HttpServlet {

	// надо почитать что такое "сериализация" в java и что такое этот
	// "serialVersionUID". В данном случае он не нужен, хоть эклипс и ругается
	// на его отсутствие. Советую разобраться и отписть что не понятно
	private static final long serialVersionUID = 1L;
	private List<Media> playList;

	static {
		// в яве есть такая конструкция. все что тут написано(код) - выполнится
		// при загрузке классса и один раз. В частности сюда можно было вынести
		// то что ты делаешь в fillPlayList();
		// но ничего не надо переделывать - просто надо знать что такая
		// конструкция есть и понять чем она отличается от инициализации в
		// конструкторе - тем что там будут все переменные static
		// ИТОГО: разобраться (спросить если не получится) что такое static
		// переменные (они хранятся в другой области памяти и инициализируются
		// при загрузке класса а не создании объекта)

	}

	public MediaServlet() {
		super();
		fillPlayList();
	}

	private void fillPlayList() {
		playList = new ArrayList<Media>();
		Audio song1 = new Audio("1", "Are you ready", "Three Days Grace", 200);
		Video film1 = new Video("2", "A Walk To Remember", 2000);
		Audio song2 = new Audio("3", "Under", "Alex Hepburn", 187);
		Video film2 = new Video("4", "The Host", 2030);
		playList.add(song1);
		playList.add(film1);
		playList.add(song2);
		playList.add(film2);
	}

	// Тут должна быть аннотация вот такая. разберись что она делает и всегда
	// используй (эклипс по дефолту ругается когда ее нету)
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// по теории в коде не должно быть текста (строк). Только константы.
		// Потому выделяешь строку "text/html" (включая ковычки) ALT+SHIFT+T ,
		// там будет меню Extract Constant. Жми его и дальше все разберешься.
		// Точно так же можешь выделить кусок кода и сдлать Extract Method или
		// Extract Variable. Попробуй использовать все меню из ALT+SHIFT+T - они
		// почти все нужны и экономят много много времени и делают кучу работы
		// за тебя
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();

		// все что написано ниже - это так назыаемый "говнокод" :)
		// давай переделаем (если есть время).
		// http://velocity.apache.org/engine/devel/developer-guide.html . Есть
		// библиотека Velocity. Все что нам от нее надо - это скормить ей шаблон
		// и сказать чтобы подставила значения. Т.е. у тебя есть по сути
		// статический текстовый файл с HTML. И в него надо вставить
		// динамические куски. Именно это и делает Velocity. Это позволит
		// избавиться от склеивания строк в классе. Попробуй переделать. Не
		// капай глубоко - той ссылки что я скинул должно хватить (1й
		// странички). Просто можешь загуглить velocity example если будет
		// проще. Саму либу подключи через POM. Вот тут какая то есть
		// http://mvnrepository.com/artifact/org.apache.velocity/velocity/1.6.2.
		// Если она не скачается - попробуй погуглить другие версии

		out.println("<html>");
		out.println("<head>");
		out.println("<title>MediaServlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h3>MediaServlet</h3>");
		out.print("<form action=\"MediaServlet\" method=POST>");

		// ID как имя параметра - тоже явный кандидат в стринговые константы
		String id = request.getParameter("ID");
		out.println("<p><select multiple name=\"ID\" size=\"6\"");
		out.println("<option value=ID></option>");

		for (Media media : playList) {
			out.println("<option value=" + media.getId() + ">" + media.mediaInformation() + "</option>");
		}

		out.println("</select></p>");
		out.println("Enter the ID of media file: ");
		out.println("<input type=text size=20 name=ID>");
		out.println("<br>");
		out.println("<br>");
		out.println("<input type=submit>");
		out.println("<br>");
		out.println("<br>");

		// try catch тут совершенно не нужен. ты сама себе кидаешь эксепшен -
		// сама себе его ловишь. Это на самом деле полная безсмыслица.
		// Оброаботка эксепшенов - это очень важная штука и на самом деел она
		// ограничивается всего несколькими концепциями, но которые нельзя
		// нарушать. Вот тут посмотри http://aectann.wikidot.com/java-exceptions-handling и потом сама прокрути пару статей которые гугл выкинул https://www.google.by/search?q=java+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0+%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA&oq=java+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0+%D0%BE&aqs=chrome.1.69i57j0l2.7925j0j7&sourceid=chrome&espv=210&es_sm=93&ie=UTF-8
		try {
			// я примерно понимаю что делает эта переменная, но не совсем.. надо
			// всегда стараться чтобы имя переменной говорило о ней все. Типа
			// endCycleFlag, isSongEqual etc.
			boolean temp = false;
			if (id != null) {
				for (Media media : playList) {
					if (media.getId().equals(id)) {
						out.println(media.mediaInformation() + " is playing!");
						temp = true;
					}
				}
				if (!temp)
					throw new UnknownMediaIdException();
			}
		} catch (UnknownMediaIdException e) {
			out.println("Media File with this ID isn't found!");
		}
		out.println("</form>");
		out.println("</body>");
		out.println("</html>");
		
		// d JAVA есть такая штука как STREAM для ввода и вывода. Надо почитать теорию по этому поводу... Так вот все стримы всегда открываются и закрываются. твой OUT не закрывается. как закрыть? Это вопрос не простой  и много мнений на этот счет. Вот пример http://stackoverflow.com/questions/7224658/java-try-finally-block-to-close-stream  (то который помечен "птичкой")
		// Но мне нравится другой вариант.. глянь сюда http://commons.apache.org/proper/commons-io/description.html  попробуй найти и подключить эту библиотеку. Там найдешь интересные штуки которые дают писать в потоки, закрывать их, копировать и кучу всего
		//P.S.На саммом деле именно в сервлетах потоки закрывать вроде не надо.. Они закроются контейнером (ТОмкатом), но лучше будет если ты даже пока не будешь про это знать и научишься правильно обрабатывать потоки
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);

	}

}
